Presto একটি শক্তিশালী ডিস্ট্রিবিউটেড SQL কোয়েরি ইঞ্জিন যা বিশাল পরিমাণ ডেটা দ্রুত এবং দক্ষতার সাথে প্রসেস করতে সক্ষম। তবে, আরও উন্নত পারফরম্যান্স এবং জটিল ডেটা বিশ্লেষণের জন্য Presto-এর কিছু অ্যাডভান্সড কোয়েরি কৌশল প্রয়োগ করা যেতে পারে। এই কৌশলগুলি বড় ডেটাসেটের সাথে কাজ করার সময় পারফরম্যান্স উন্নত করতে সহায়তা করে এবং কোয়েরি এক্সিকিউশন আরও দক্ষ করে তোলে।
এখানে কিছু Advanced Presto Query Techniques আলোচনা করা হলো:
Presto তে Joins একটি অত্যন্ত শক্তিশালী কৌশল, তবে বড় ডেটাসেটের সাথে কাজ করার সময় সঠিক Join ব্যবহার করা প্রয়োজন। Presto বিভিন্ন ধরনের Join সাপোর্ট করে, যেমন Inner Join, Left Join, Right Join, Full Join, Cross Join, এবং Semi Join।
কোয়েরি উদাহরণ:
SELECT *
FROM large_table AS l
JOIN small_table AS s ON l.id = s.id
এটি Presto কে নির্দেশ করবে যে small_table
কে broadcast করতে এবং large_table
এর সাথে Join করতে।
যখন ডেটার একটি বড় পরিমাণ রয়েছে, তখন Partitioned Join ব্যবহার করা হয়, যা Join অপারেশনকে বিভিন্ন অংশে ভাগ করে এবং সেগুলি আলাদাভাবে প্রসেস করে, যাতে স্কেলেবল পারফরম্যান্স পাওয়া যায়।
কোয়েরি উদাহরণ:
SELECT *
FROM large_table l
JOIN partitioned_table p ON l.partition_key = p.partition_key
এখানে, partition_key কলামের উপর ভিত্তি করে ডেটা আলাদা আলাদা Worker Node-এ প্রক্রিয়া হবে।
Window Functions (যেমন ROW_NUMBER(), RANK(), DENSE_RANK(), LEAD(), LAG()) এক্সিকিউশন ফর্ম্যাটে পরিবর্তন আনার পাশাপাশি বিশেষ ধরনের অ্যালগোরিদম পরিচালনা করতে সাহায্য করে। এগুলি রো এর উপর বিভিন্ন অপারেশন প্রয়োগ করতে সহায়ক।
আপনি যদি একটি টেবিল থেকে সর্বোচ্চ বা সর্বনিম্ন রাঙ্ক করা রেকর্ডগুলি বের করতে চান, তবে ROW_NUMBER() ব্যবহার করতে পারেন:
কোয়েরি উদাহরণ:
SELECT id, amount, ROW_NUMBER() OVER (PARTITION BY category ORDER BY amount DESC) AS rank
FROM sales
এখানে, প্রতিটি category এর জন্য amount এর উপর ভিত্তি করে ROW_NUMBER() প্রয়োগ করা হচ্ছে এবং রাঙ্কিং করা হচ্ছে।
LEAD() এবং LAG() ফাংশন ব্যবহার করে আপনি পূর্ববর্তী বা পরবর্তী রো এর মান প্রাপ্তি করতে পারেন।
কোয়েরি উদাহরণ (LEAD()):
SELECT id, amount, LEAD(amount, 1) OVER (ORDER BY amount) AS next_amount
FROM sales
এটি প্রতিটি রো-এর পরবর্তী রো এর amount দেখাবে।
Subqueries বা Nested Queries Presto তে অত্যন্ত কার্যকরী, বিশেষত যখন আপনি একটি কোয়েরির ফলাফলের উপর ভিত্তি করে আরেকটি কোয়েরি চালাতে চান।
Correlated Subqueries এমন সাবকোয়েরি যা বাইরের কোয়েরি থেকে মান গ্রহণ করে এবং এর মধ্যে সম্পর্ক তৈরি হয়।
কোয়েরি উদাহরণ:
SELECT id, name
FROM products p
WHERE price > (SELECT AVG(price) FROM products WHERE category = p.category)
এখানে, বাইরের কোয়েরি category
অনুযায়ী price
এর গড় নির্ধারণ করবে এবং তারপরে বাইরের কোয়েরি সেই গড় মূল্যের চেয়ে বড় মূল্যগুলি নির্বাচন করবে।
Non-Correlated Subqueries সাধারণত স্বাধীন সাবকোয়েরি যেখানে বাইরের কোয়েরির সাথে কোনো সম্পর্ক থাকে না।
কোয়েরি উদাহরণ:
SELECT id, name
FROM products
WHERE category IN (SELECT category FROM categories WHERE active = true)
এটি প্রথমে categories
টেবিল থেকে সক্রিয় ক্যাটাগরি নির্বাচন করে এবং পরে সেই ক্যাটাগরির products
নির্বাচিত করে।
Presto তে Set Operations (যেমন UNION, INTERSECT, EXCEPT) ব্যবহার করে আপনি একাধিক কোয়েরির মধ্যে সম্পর্ক নির্ধারণ করতে পারেন, যেমন দুটি কোয়েরির মধ্যে সাধারণ রেকর্ড বের করা বা পার্থক্য বের করা।
UNION ব্যবহার করে আপনি দুটি কোয়েরির মধ্যে সমস্ত ইউনিক রেকর্ড বের করতে পারেন (ডুপ্লিকেট বাদ দিয়ে):
কোয়েরি উদাহরণ:
SELECT id, name FROM products WHERE category = 'Electronics'
UNION
SELECT id, name FROM products WHERE category = 'Books'
এটি Electronics
এবং Books
ক্যাটাগরির সমস্ত ইউনিক রেকর্ড একত্রে প্রদান করবে।
INTERSECT ব্যবহার করে আপনি দুটি কোয়েরির মধ্যে সাধারণ রেকর্ডগুলো বের করতে পারেন:
কোয়েরি উদাহরণ:
SELECT id, name FROM products WHERE category = 'Electronics'
INTERSECT
SELECT id, name FROM products WHERE category = 'Books'
এটি শুধুমাত্র সেই রেকর্ডগুলো প্রদান করবে যা Electronics
এবং Books
উভয় ক্যাটাগরিতে রয়েছে।
EXCEPT ব্যবহার করে আপনি দুটি কোয়েরির মধ্যে একক রেকর্ড যা একটি কোয়েরিতে আছে কিন্তু অন্যটিতে নেই তা বের করতে পারেন:
কোয়েরি উদাহরণ:
SELECT id, name FROM products WHERE category = 'Electronics'
EXCEPT
SELECT id, name FROM products WHERE category = 'Books'
এটি Electronics
ক্যাটাগরির সমস্ত রেকর্ড প্রদান করবে যেগুলি Books
ক্যাটাগরিতে নেই।
Partition Pruning এবং Predicate Pushdown Presto এর পারফরম্যান্স অপটিমাইজেশনে অত্যন্ত কার্যকরী।
Presto পার্টিশনযুক্ত টেবিলের জন্য Partition Pruning ব্যবহার করে অপ্রয়োজনীয় পার্টিশন বাদ দেয় এবং শুধুমাত্র প্রয়োজনীয় পার্টিশনে কোয়েরি চালায়।
কোয়েরি উদাহরণ:
SELECT * FROM sales WHERE date = '2024-11-27'
এটি sales টেবিল থেকে শুধুমাত্র 2024-11-27
তারিখের পার্টিশন পড়বে, বাকি পার্টিশনগুলি বাদ দেবে।
Presto ব্যবহারকারী কোয়েরির শর্তগুলি ডেটাসোর্সের স্তরে সরাসরি প্রয়োগ করে, যা Predicate Pushdown নামে পরিচিত। এতে প্রক্রিয়া শুরু হওয়ার আগে ডেটা ফিল্টার করা হয়, যা কোয়েরির পারফরম্যান্স বৃদ্ধি করে।
কোয়েরি উদাহরণ:
SELECT * FROM products WHERE price > 100
Presto price > 100
শর্তটি সঠিক ডেটা সোর্সে পাঠাবে এবং সেখানেই ফিল্টার করবে, Presto কে পুরো টেবিল স্ক্যান করার প্রয়োজন পড়বে না।
Advanced Presto Query Techniques যেমন Complex Joins, Window Functions, Subqueries, Set Operations, Partition Pruning, এবং Predicate Pushdown ব্যবহার করে আপনি Presto এর পারফরম্যান্স উন্নত করতে পারেন এবং আরও জটিল ডেটা বিশ্লেষণ করতে সক্ষম হবেন। এই কৌশলগুলি বৃহৎ ডেটাসেটের সাথে কাজ করার সময় কার্যকরী এবং স্কেলেবিলিটি নিশ্চিত করে।
SQL-এ Joins এবং Nested Queries (বা Subqueries) অত্যন্ত শক্তিশালী এবং গুরুত্বপূর্ণ টুলস, যেগুলি বিভিন্ন টেবিলের মধ্যে সম্পর্ক স্থাপন এবং জটিল প্রশ্নের উত্তর খুঁজে বের করতে সাহায্য করে। Advanced Joins এবং Nested Queries ব্যবহারের মাধ্যমে আপনি আরও জটিল ডেটা বিশ্লেষণ করতে পারবেন।
SQL Joins ব্যবহার করে একাধিক টেবিলের মধ্যে সম্পর্ক স্থাপন করা হয় এবং বিভিন্ন টেবিলের ডেটা একত্রে দেখা যায়। Advanced Joins হল সাধারণ Joins এর আরও উন্নত রূপ, যেখানে জটিল সম্পর্ক স্থাপন, ডেটা ফিল্টারিং এবং আরও উন্নত কাজ করা হয়।
INNER JOIN দুটি টেবিলের মধ্যে মিল থাকা রেকর্ডগুলিকে একত্রিত করে। যেসব রেকর্ড দুটি টেবিলের মধ্যে মিলিত হয়, শুধু সেগুলিই ফলাফলে আসে।
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
এখানে employees
এবং departments
টেবিলের মধ্যে department_id
এবং id
কলামের মধ্যে মিলিত রেকর্ড গুলি প্রদর্শিত হবে।
LEFT JOIN মূল টেবিলের সমস্ত রেকর্ড নিয়ে আসে এবং সম্পর্কিত রেকর্ড পাওয়া না গেলে NULL দেখায়।
SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
এখানে employees টেবিলের সমস্ত রেকর্ড দেখানো হবে, এবং departments টেবিলের সাথে সম্পর্কিত ডেটা থাকলে তা প্রদর্শিত হবে, না থাকলে NULL
দেখাবে।
RIGHT JOIN হল LEFT JOIN এর বিপরীত, যেখানে মূল টেবিলের ডেটা থেকে রেকর্ডগুলির পাশাপাশি সম্পর্কিত রেকর্ড পাওয়া না গেলে NULL দেখায়।
SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
এখানে departments টেবিলের সমস্ত রেকর্ড দেখানো হবে এবং সম্পর্কিত employees টেবিলের ডেটা থাকলে তা প্রদর্শিত হবে।
FULL JOIN দুটি টেবিলের সমস্ত রেকর্ড তুলে আনে, এবং যেখানে সম্পর্কিত ডেটা থাকে, সেখানে ডেটা দেখায়। যেসব রেকর্ডে মিল নেই, সেখানে NULL দেখায়।
SELECT employees.name, departments.name
FROM employees
FULL JOIN departments
ON employees.department_id = departments.id;
এখানে employees এবং departments টেবিলের সমস্ত রেকর্ড আনা হবে, যেখানে মিল থাকলে ডেটা দেখাবে এবং না থাকলে NULL দেখাবে।
CROSS JOIN দুটি টেবিলের মধ্যে সমস্ত সম্ভব মিল তৈরি করে, অর্থাৎ একটি টেবিলের প্রতিটি রেকর্ডের সাথে অন্য টেবিলের সমস্ত রেকর্ড জোড়া তৈরি করে। এটি একে অপরের সাথে Cartesian Product তৈরি করে।
SELECT employees.name, departments.name
FROM employees
CROSS JOIN departments;
এখানে, employees এবং departments টেবিলের সমস্ত রেকর্ডের মিল তৈরি হবে।
SELF JOIN একটি টেবিলকে নিজের সাথে যোগ করার প্রক্রিয়া, যা JOIN এর মতো কাজ করে, তবে একই টেবিলের মধ্যে সম্পর্ক স্থাপন করা হয়।
SELECT e1.name AS Employee, e2.name AS Manager
FROM employees e1
INNER JOIN employees e2
ON e1.manager_id = e2.id;
এখানে employees টেবিলের মধ্যে কর্মী এবং তাদের ম্যানেজারের সম্পর্ক স্থাপন করা হচ্ছে।
Nested Queries বা Subqueries হল SQL কোয়েরির মধ্যে কোয়েরি, যা একটি মূল কোয়েরির মধ্যে অন্তর্ভুক্ত থাকে এবং ডেটার উপর আরও নির্দিষ্ট প্রশ্ন করতে সাহায্য করে। Subquery মূল কোয়েরির শর্ত হিসেবে ব্যবহৃত হয় এবং এটি সাধারণত WHERE, FROM, SELECT, বা HAVING ক্লজের মধ্যে থাকতে পারে।
WHERE ক্লজে Subquery ব্যবহার করা হয় যখন মূল কোয়েরি কোনো শর্ত পূর্ণ করার জন্য একটি অস্থায়ী কোয়েরির ফলাফল চায়।
SELECT name, salary
FROM employees
WHERE department_id = (SELECT id FROM departments WHERE name = 'HR');
এখানে, প্রথম কোয়েরি employees টেবিল থেকে সমস্ত কর্মীকে নির্বাচিত করবে যাদের department_id একটি সাবকোয়েরি দ্বারা পাওয়া HR বিভাগের id এর সমান।
SELECT ক্লজে Subquery ব্যবহার করা হয় যখন আপনি মূল কোয়েরির ফলাফলের সাথে কোনো অতিরিক্ত গণনা বা ডেটা যুক্ত করতে চান।
SELECT name,
(SELECT MAX(salary) FROM employees WHERE department_id = 1) AS MaxSalary
FROM employees;
এখানে, প্রতিটি কর্মী এবং তাদের department_id = 1 এর জন্য MAX(salary) দেখানো হবে।
FROM ক্লজে Subquery ব্যবহার করা হয় যখন মূল কোয়েরি একটি টেবিলের মতো একটি সাবকোয়েরির ফলাফল ব্যবহার করতে চায়।
SELECT department_id, AVG(salary)
FROM (SELECT department_id, salary FROM employees WHERE salary > 50000) AS high_salary
GROUP BY department_id;
এখানে, প্রথমে একটি সাবকোয়েরি দ্বারা salary > 50000 কর্মীদের বের করা হবে এবং তারপর তাদের গড় বেতন গোনা হবে।
Correlated Subquery হল এমন একটি সাবকোয়েরি যা মূল কোয়েরির প্রতিটি রেকর্ডের জন্য আলাদাভাবে চালিত হয়। সাবকোয়েরি মূল কোয়েরির রেকর্ডের সাথে সম্পর্কিত।
SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (SELECT AVG(e2.salary) FROM employees e2 WHERE e1.department_id = e2.department_id);
এখানে, প্রতিটি কর্মীর বেতন তার বিভাগের গড় বেতনের থেকে বেশি কিনা তা যাচাই করা হচ্ছে।
EXISTS সাবকোয়েরি ব্যবহার করা হয় যখন আপনি চেক করতে চান যে কোনও রেকর্ড রয়েছে কি না।
SELECT name
FROM employees
WHERE EXISTS (SELECT 1 FROM departments WHERE employees.department_id = departments.id);
এখানে, employees টেবিলের সকল কর্মী নির্বাচন করা হবে যাদের department_id departments টেবিলে রয়েছে।
এই টুলগুলো ব্যবহারে আপনি আরও জটিল প্রশ্ন এবং ডেটা বিশ্লেষণ করতে পারবেন, যা SQL কোডে দক্ষতা বৃদ্ধি করবে।
Presto তে Set Operations হলো SQL কুয়েরিতে ব্যবহৃত অপারেশন, যা দুটি বা তার বেশি সিলেক্ট অ্যাকশনের মধ্যে সেট থিওরি ব্যবহার করে ডেটার মিল বা পার্থক্য নির্ধারণ করে। প্রধান তিনটি সেট অপারেশন হলো UNION, INTERSECT, এবং EXCEPT। প্রতিটি অপারেশন নির্দিষ্ট ধরনের ডেটা সংযুক্তি বা পার্থক্য প্রদর্শন করে।
UNION অপারেশন দুটি বা তার বেশি SQL কুয়েরির ফলাফলকে একত্রিত করে এবং ফলস্বরূপ ইউনিক (distinct) রেকর্ড প্রদান করে। যদি দুইটি সিলেক্ট স্টেটমেন্টের মধ্যে একাধিক সারি সমান হয়, তাহলে ঐ সারি কেবল একবার প্রদর্শিত হবে (distinct)।
SELECT column1, column2
FROM table1
UNION
SELECT column1, column2
FROM table2;
SELECT employee_id, employee_name
FROM employees_2023
UNION
SELECT employee_id, employee_name
FROM employees_2024;
এই কুয়েরিটি employees_2023 এবং employees_2024 টেবিল থেকে ইউনিক employee_id এবং employee_name ফেরত দেবে। যেগুলি যেকোনো ধরনের ডুপ্লিকেট ফলস্বরূপ থাকলে সেগুলি বাদ দেওয়া হবে।
UNION ALL অপারেশন UNION এর মতোই, তবে এটি ডুপ্লিকেট রেকর্ডকেও অন্তর্ভুক্ত করে, অর্থাৎ দুটি বা তার বেশি সিলেক্ট স্টেটমেন্টের ফলাফল একত্রিত হবে, এবং কোনও ডুপ্লিকেট রেকর্ড বাদ দেওয়া হবে না।
SELECT column1, column2
FROM table1
UNION ALL
SELECT column1, column2
FROM table2;
SELECT employee_id, employee_name
FROM employees_2023
UNION ALL
SELECT employee_id, employee_name
FROM employees_2024;
এই কুয়েরিটি employees_2023 এবং employees_2024 টেবিলের সমস্ত রেকর্ড (ডুপ্লিকেট সহ) একত্রিত করবে।
INTERSECT অপারেশন দুটি বা তার বেশি SQL কুয়েরির মধ্যে কমন রেকর্ড বা মিল খুঁজে বের করে। অর্থাৎ, এটি কেবলমাত্র সেই রেকর্ডগুলো ফেরত দেয় যা সমস্ত সিলেক্ট স্টেটমেন্টে উপস্থিত থাকে।
SELECT column1, column2
FROM table1
INTERSECT
SELECT column1, column2
FROM table2;
SELECT employee_id, employee_name
FROM employees_2023
INTERSECT
SELECT employee_id, employee_name
FROM employees_2024;
এই কুয়েরিটি শুধুমাত্র সেই employee_id এবং employee_name রেকর্ডগুলি ফেরত দেবে যা employees_2023 এবং employees_2024 উভয় টেবিলে উপস্থিত রয়েছে।
EXCEPT অপারেশন দুটি কুয়েরির মধ্যে পার্থক্য খুঁজে বের করে, অর্থাৎ এটি প্রথম কুয়েরির সমস্ত রেকর্ড ফেরত দেয় যেগুলি দ্বিতীয় কুয়েরিতে উপস্থিত নেই। এটি MINUS হিসেবেও পরিচিত।
SELECT column1, column2
FROM table1
EXCEPT
SELECT column1, column2
FROM table2;
SELECT employee_id, employee_name
FROM employees_2023
EXCEPT
SELECT employee_id, employee_name
FROM employees_2024;
এই কুয়েরিটি শুধুমাত্র সেই employee_id এবং employee_name রেকর্ডগুলো ফেরত দেবে যা employees_2023 টেবিলে আছে কিন্তু employees_2024 টেবিলে নেই।
এই Set Operations গুলি SQL কোয়েরির মধ্যে ডেটা সংযোগ, পার্থক্য, এবং মিল খুঁজে বের করার জন্য শক্তিশালী টুল হিসেবে ব্যবহৃত হয়।
Window Functions হল SQL ফাংশনের একটি বিশেষ শ্রেণী যা রেকর্ডের একটি সেট বা "window" এর উপর ভিত্তি করে গণনা করে এবং প্রতিটি রেকর্ডের জন্য একটি নির্দিষ্ট আউটপুট প্রদান করে। এগুলি সাধারণভাবে লিডিং এবং ল্যাগিং (ফলক এবং পূর্ববর্তী রেকর্ডের সাথে তুলনা), রানিং টোটাল, রেটিং, এবং ডেনসিটি গণনার জন্য ব্যবহৃত হয়।
Presto তে Window Functions খুবই শক্তিশালী এবং স্কেলেবল পদ্ধতি হিসেবে কাজ করে। এটি আপনাকে একটি নির্দিষ্ট ভিউ বা উইন্ডোর মধ্যে ডেটার উপর গণনা করার সুযোগ দেয়, যা খুবই উপকারী যখন আপনি কোনও নির্দিষ্ট রেঞ্জ বা শর্তের মধ্যে কাজ করতে চান।
OVER()
ক্লজ সহ ব্যবহৃত হয়। এই ক্লজটি প্রথম বা শেষ রেকর্ডের তুলনা, অথবা একটি চলন্ত গড় বা মোট বের করতে সাহায্য করে।Presto তে বেশ কিছু জনপ্রিয় Window Functions রয়েছে, যা ডেটার উপর বিশ্লেষণ এবং গণনা করতে ব্যবহৃত হয়। এর মধ্যে অন্যতম:
ROW_NUMBER()
ফাংশনটি একটি রেকর্ড সেটের মধ্যে প্রতিটি রেকর্ডের জন্য একটি ইউনিক নম্বর প্রদান করে, এটি প্রতিটি রেকর্ডকে একটি নির্দিষ্ট ক্রমে নংকিত করে।
ব্যবহার:
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;
এই কোয়েরিটি কর্মচারীদের বেতনের ভিত্তিতে তাদেরকে একটি ক্রমবদ্ধ নম্বর প্রদান করবে।
RANK()
ফাংশনটি রেকর্ডগুলির মধ্যে রেঙ্কিং প্রদান করে। তবে, এটি একটি সাধারণ নম্বর নিকালবে, যেখানে একাধিক রেকর্ড একই রেঙ্ক শেয়ার করতে পারে।
ব্যবহার:
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;
এটি কর্মচারীদের বেতনের ভিত্তিতে তাদের রেঙ্ক প্রদান করবে, তবে দুটি কর্মচারীর যদি সমান বেতন থাকে, তারা সমান রেঙ্ক পাবে এবং পরবর্তী রেঙ্কটি এক পদস্খলিত হবে।
DENSE_RANK()
ফাংশনটি RANK()
এর মতো কাজ করে, তবে এটি দুটি বা তার বেশি সমান রেকর্ডের জন্য রেঙ্কের মধ্যে গ্যাপ না রেখে সন্নিবেশ ঘটায়।
ব্যবহার:
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;
এই কোয়েরি কর্মচারীদের বেতনের ভিত্তিতে রেঙ্ক প্রদান করবে, তবে যদি দুটি কর্মচারীর সমান বেতন থাকে, তারা একই রেঙ্ক পাবে এবং পরবর্তী রেঙ্কটি ধারাবাহিকভাবে প্রদর্শিত হবে।
NTILE()
ফাংশনটি রেকর্ডগুলিকে একটি নির্দিষ্ট সংখ্যক ভাগে ভাগ করে দেয় (যেমন 4টি ভাগে ভাগ করা), এবং প্রতিটি ভাগের জন্য একটি নং প্রদান করে।
ব্যবহার:
SELECT name, salary,
NTILE(4) OVER (ORDER BY salary DESC) AS quartile
FROM employees;
এই কোয়েরিটি কর্মচারীদের বেতন অনুযায়ী তাদের চারটি সমান ভাগে ভাগ করবে এবং প্রতিটি ভাগের জন্য একটি সংখ্যা প্রদান করবে।
LEAD()
ফাংশনটি বর্তমান রেকর্ডের পরে থাকা রেকর্ডের মান ফেরত দেয়। এটি ব্যবহার করে আপনি বর্তমান রেকর্ডের তুলনায় পরবর্তী রেকর্ডের মান বিশ্লেষণ করতে পারেন।
ব্যবহার:
SELECT name, salary,
LEAD(salary, 1) OVER (ORDER BY salary DESC) AS next_salary
FROM employees;
এই কোয়েরিটি কর্মচারীর বর্তমান বেতন এবং পরবর্তী কর্মচারীর বেতন প্রদান করবে।
LAG()
ফাংশনটি LEAD()
এর বিপরীত কাজ করে, যেখানে এটি বর্তমান রেকর্ডের পূর্ববর্তী রেকর্ডের মান ফেরত দেয়।
ব্যবহার:
SELECT name, salary,
LAG(salary, 1) OVER (ORDER BY salary DESC) AS prev_salary
FROM employees;
এই কোয়েরিটি কর্মচারীর বর্তমান বেতন এবং তার আগের কর্মচারীর বেতন প্রদান করবে।
FIRST_VALUE()
ফাংশনটি একটি উইন্ডো বা অংশের মধ্যে প্রথম মান প্রদান করে।
ব্যবহার:
SELECT name, salary,
FIRST_VALUE(salary) OVER (ORDER BY salary DESC) AS highest_salary
FROM employees;
এটি কর্মচারীদের মধ্যে প্রথম মান (সর্বোচ্চ বেতন) প্রদান করবে, যেহেতু বেতন ডেসক্রিং অর্ডারে সজ্জিত।
LAST_VALUE()
ফাংশনটি একটি উইন্ডো বা অংশের মধ্যে সর্বশেষ মান প্রদান করে।
ব্যবহার:
SELECT name, salary,
LAST_VALUE(salary) OVER (ORDER BY salary DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS lowest_salary
FROM employees;
এটি কর্মচারীদের মধ্যে সর্বশেষ মান (নিম্নতম বেতন) প্রদান করবে।
SUM()
এবং AVG()
ফাংশনগুলি Window Functions হিসেবেও ব্যবহার করা যায়, যেখানে আপনি নির্দিষ্ট উইন্ডো বা অংশের উপর সন্নিবেশ ও গড় হিসাব করতে পারেন।
ব্যবহার:
SELECT name, salary,
SUM(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS department_salary_total,
AVG(salary) OVER (PARTITION BY department) AS department_avg_salary
FROM employees;
এই কোয়েরিটি প্রতিটি বিভাগের জন্য মোট বেতন এবং গড় বেতন হিসাব করবে।
Window Functions SQL এর একটি শক্তিশালী টুল যা আপনাকে একাধিক রেকর্ডের উপর ভিত্তি করে বিভিন্ন ধরনের বিশ্লেষণ এবং গণনা করার সুযোগ দেয়। এগুলি বিশ্লেষণাত্মক ফাংশন যেমন RANK()
, LEAD()
, LAG()
, এবং SUM()
সহ ব্যবহার করা হয়। Presto তে Window Functions ব্যবহার করে আপনি কার্যকরী এবং দক্ষ ডেটা বিশ্লেষণ করতে পারেন, যা বিশেষত বড় ডেটাসেট বিশ্লেষণের জন্য অত্যন্ত কার্যকরী।
Presto একটি ডিস্ট্রিবিউটেড SQL কোয়েরি ইঞ্জিন, যা বড় ডেটাসেটের উপর দ্রুত এবং স্কেলযোগ্য কোয়েরি এক্সিকিউশন নিশ্চিত করতে সক্ষম। Query Parallelization এবং Performance Improvements হল Presto এর দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা একে উচ্চ পারফরম্যান্স এবং কার্যকরী করে তোলে।
এই টিউটোরিয়ালে আমরা Query Parallelization এবং Performance Improvements এর মূল ধারণা, কৌশল, এবং প্রক্রিয়া আলোচনা করব।
Query Parallelization হল একাধিক প্রসেস বা থ্রেডে কোয়েরি এক্সিকিউশন ভাগ করা, যাতে ডেটা প্রক্রিয়াকরণের গতি বৃদ্ধি পায়। Presto ডিস্ট্রিবিউটেড আর্কিটেকচারের মাধ্যমে কোয়েরির কাজ 多个 worker nodes এর মধ্যে বিভক্ত করে এবং এইভাবে প্রতিটি worker node তার নির্দিষ্ট কাজের অংশ সম্পন্ন করে।
GROUP BY
, JOIN
, বা ORDER BY
অপারেশনগুলোতে ডেটা ভাগ করা হয় যাতে প্রতিটি অংশ পৃথকভাবে প্রক্রিয়া করা যায়।JOIN
বা GROUP BY
অপারেশনের জন্য)।ধরা যাক, একটি কোয়েরি GROUP BY
এবং JOIN
অপারেশন নিয়ে কাজ করছে, Presto এটি প্রতিটি worker node-এ আলাদাভাবে ভাগ করবে, এবং প্রতিটি অংশে পৃথকভাবে কাজ হবে।
SELECT customer_id, SUM(amount)
FROM hive.default.orders
GROUP BY customer_id;
এই কোয়েরি যদি বিশাল ডেটাসেটের উপর চলে, Presto ঐ ডেটাসেটটি Worker Node-এ ভাগ করে চালাবে। এইভাবে, প্রতিটি Worker Node আলাদা আলাদা গ্রুপের জন্য SUM(amount)
গণনা করবে, এবং শেষে Coordinator Node সেগুলিকে একত্রিত করবে।
Presto-তে পারফরম্যান্স উন্নত করার জন্য কিছু অপ্টিমাইজেশন কৌশল এবং বৈশিষ্ট্য রয়েছে যা Query Execution দ্রুত করতে সাহায্য করে। নিচে কিছু গুরুত্বপূর্ণ কৌশল এবং অপ্টিমাইজেশন টেকনিক আলোচনা করা হলো:
Predicate Pushdown হল একটি অপ্টিমাইজেশন কৌশল যেখানে কোয়েরির WHERE ক্লজে থাকা শর্তগুলি, যতটা সম্ভব, ডেটা সোর্সে (যেমন Hive, MySQL) প্রক্রিয়া করা হয়। এতে কম ডেটা প্রসেস করা হয় এবং পরবর্তীতে Presto-তে কম ডেটা লোড হয়।
উদাহরণ:
SELECT * FROM hive.default.orders WHERE order_status = 'shipped';
এই কোয়েরি যখন Presto Hive এর সাথে চালানো হয়, তখন WHERE
শর্তটি Hive স্তরে প্রক্রিয়া করা হয়, ফলে কম ডেটা Presto-তে আনা হয়।
Column Pruning হল একটি কৌশল যেখানে শুধুমাত্র প্রয়োজনীয় কলামগুলি নির্বাচিত হয়। এতে অপ্রয়োজনীয় কলামগুলি লোড না করে, কোয়েরি দ্রুত সম্পন্ন হয়।
উদাহরণ:
SELECT order_id, customer_id FROM hive.default.orders;
এই কোয়েরিতে শুধুমাত্র order_id
এবং customer_id
কলামগুলি নির্বাচিত হচ্ছে, তাই Presto অন্যান্য কলামগুলো লোড করবে না।
Presto Join Optimization-এর মাধ্যমে দ্রুত ফলাফল প্রদান করতে পারে। বিভিন্ন ধরনের জয়েন অপারেশন (যেমন Hash Join, Merge Join, Nested Loop Join) নির্বাচন করে, Presto দ্রুত কোয়েরি এক্সিকিউশন করতে সক্ষম হয়।
Presto কোয়েরি ফলাফলগুলো ক্যাশে করতে পারে, যাতে পুনরায় একই কোয়েরি চালানোর সময় দ্রুত ফলাফল পাওয়া যায়। Presto-এর ক্যাশে সিস্টেম তাতে সাহায্য করে যখন একই কোয়েরি পুনরায় চালানো হয়।
Presto তে মেমরি এবং সিপিইউ ব্যবস্থাপনা অত্যন্ত গুরুত্বপূর্ণ। Memory management এবং CPU optimization করতে, Presto query.max-memory-per-node এবং query.max-total-memory-per-node প্যারামিটার ব্যবহার করতে পারে, যাতে কোয়েরি এক্সিকিউশনের সময় বেশি মেমরি ব্যবহার না হয়।
config.properties কনফিগারেশন:
query.max-memory=5GB
query.max-memory-per-node=1GB
Presto ক্লাস্টারে বিভিন্ন কোয়েরি একসাথে প্যারালালভাবে এক্সিকিউট করা হয়, এবং Dynamic Workload Management (DWM) ব্যবহার করে, কোয়েরির জন্য পর্যাপ্ত রিসোর্স বরাদ্দ করা হয়। এতে প্রতিটি কোয়েরি সঠিকভাবে সম্পন্ন হয় এবং একে অপরের উপর প্রভাব ফেলে না।
Presto Hive বা অন্যান্য ডেটা সোর্সের জন্য partitioning ব্যবহার করে ডেটা ভাগ করা হয়। এটি সঠিক পার্টিশন থেকে ডেটা ফিল্টার এবং প্রসেস করার মাধ্যমে পারফরম্যান্স উন্নত করে।
Presto-এর পারফরম্যান্স টিউনিং করা যেতে পারে বিভিন্ন কৌশল ও অপ্টিমাইজেশন টেকনিক ব্যবহারের মাধ্যমে:
এই কৌশলগুলো আপনাকে Presto কোয়েরি এক্সিকিউশনের পারফরম্যান্স উন্নত করতে এবং বৃহৎ ডেটাসেটের উপর দ্রুত বিশ্লেষণ করতে সহায়ক হবে।
Read more